package f.h.dragon.util;

import f.h.dragon.util.BitArray;
import f.h.dragon.util.Bits;

/**
 * StringUtil:字符串工具类，提供针对字符串的通用操作
 * 
 * @author Wenlong Meng(wenlong.meng@gmail.com)
 * @version 1.0 at 2012/02/07
 * @since 1.0
 */
public class StringUtil {
	
	/**
	 * 将str转化为int类型值，若出错或为空，则返回defaultVal
	 * 
	 * @param str 待转化字符串
	 * @param defaultVal 默认值
	 * @return
	 */
	public static int toInt(String str, int defaultVal){
		try {
			return Integer.valueOf(str);
		} catch (Exception e) {
			return defaultVal;
		}
	
	}

	/**
	 * 获取str前byteLength个字节对应的字符：（字母算一个字节，所有用一个以上字节表示的字符算两个字节）
	 * 1、若str为空或其字符长度 * 2 小于byteLength，则返回其本身
	 * 2、字母算一个字节，所有一个以上字节的字符算两个字节，截取前byteLength个字节，若存在不完整字符，则舍去。 若suffix不为空，
	 * 则被截取的字符替换为suffix
	 * 
	 * @param str 待处理字符串
	 * @param byteLength 截取长度
	 * @param suffix 后缀
	 * @return
	 * @version 2.0 修改最后半字时舍去
	 */
	public static final String subStrByByte(String str, int byteLength, String suffix){
		return subStrByByte(str, byteLength, suffix, null);
	}
	
	/**
	 * 获取str前byteLength个字节对应的字符(若字符包含在ingoreChars中，则忽略该字符)：（字母算一个字节，所有用一个以上字节表示的字符算两个字节）
	 * 1、若str为空或其字符长度 * 2 小于byteLength，则返回其本身
	 * 2、字母算一个字节，所有一个以上字节的字符算两个字节，截取前byteLength个字节，若存在不完整字符，则舍去。 若suffix不为空，
	 * 则被截取的字符替换为suffix
	 * 
	 * @param str 待处理字符串
	 * @param byteLength 截取长度
	 * @param suffix 后缀
	 * @param ignoreChars 忽略字符集
	 * @return
	 * @version 2.0 修改最后半字时舍去
	 */
	public static final String subStrByByte(String str, int byteLength, String suffix, String ignoreChars){
		
		//为空，或字符总数小于指定长度(字符最大长度按2字节算)，则返回原始字符串
		if(isEmpty(str) || str.length() * 2 <= byteLength){
			return str;
		}
		
		//字符串截取
		if(str.length() > byteLength){//避免字符串超长，导致内存浪费
			str = str.substring(0, byteLength + 1);
		}
		char[] cs = str.toCharArray();
		int i = 0;
		int len = 0;
		//有忽略字符处理
		if(!isEmpty(ignoreChars)){
			//store ingore chars
			Bits bits = new BitArray();
			for(char c : ignoreChars.toCharArray()){
				bits.set(c, 1);
			}
			char _c;//temp var
			while ((len < byteLength) && (i < cs.length)) {//依次处理每个字符
				_c = cs[i++];
				if(bits.get(_c) != 1){
					len += (_c > 0xff ? 2 : 1);
				}
			}
		//无忽略字符处理
		}else{
			while ((len < byteLength) && (i < cs.length)) {//依次处理每个字符
				len += (cs[i++] > 0xff ? 2 : 1);
			}
		}
		
		//最后半个字则舍去
		i -= (len > byteLength ? 1 : 0);
		
		//截取字符替换为指定后缀
		return cs.length <= i ? str : str.substring(0, i) + (!isEmpty(suffix) ? suffix : "");
	}
	
	/**
     * <p>Checks if a String is empty ("") or null.</p>
     *
     * <pre>
     * StringUtils.isEmpty(null)      = true
     * StringUtils.isEmpty("")        = true
     * StringUtils.isEmpty(" ")       = false
     * StringUtils.isEmpty("bob")     = false
     * StringUtils.isEmpty("  bob  ") = false
     * </pre>
     *
     * <p>NOTE: This method changed in Lang version 2.0.
     * It no longer trims the String.
     * That functionality is available in isBlank().</p>
     *
     * @param str  the String to check, may be null
     * @return <code>true</code> if the String is empty or null
     */
    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }
    
    /**
     * <p>Checks if a String is whitespace, empty ("") or null.</p>
     *
     * <pre>
     * StringUtils.isBlank(null)      = true
     * StringUtils.isBlank("")        = true
     * StringUtils.isBlank(" ")       = true
     * StringUtils.isBlank("bob")     = false
     * StringUtils.isBlank("  bob  ") = false
     * </pre>
     *
     * @param str  the String to check, may be null
     * @return <code>true</code> if the String is null, empty or whitespace
     * @since 2.0
     */
    public static boolean isBlank(String str) {
        int strLen;
        if (str == null || (strLen = str.length()) == 0) {
            return true;
        }
        for (int i = 0; i < strLen; i++) {
            if ((Character.isWhitespace(str.charAt(i)) == false)) {
                return false;
            }
        }
        return true;
    }
	
	/**
	 * 指定url转化为ssl安全的url：
	 * 	1、若url为空(" "或null)或以https开头，则返回其本身
	 *  2、若url以http开头，则替换为https开头
	 *  3、若url不以http开头，则添加https://
	 * 
	 * @param url url字符串
	 * @return
	 */
	public static final String toSSLUrl(String url){
		
		//为空，则返回原url
		if(isBlank(url)){
			return url;
		}
		
		if(url.startsWith("http:")){
			url = url.replaceFirst("http:", "https:");
		}else if(url.startsWith("https:")){
			
		}else{
			url = "https://" + url;
		}
		
		return url;
	}

	//test
	/**
	 * test...
	 * 
	 * @param args
	 */
	public static void main(String[] args){
		String cs = "aaaaaaaaaa 啊啊…";
		System.out.println(subStrByByte(cs, 12, "...", " "));
	}
}
